package config

import (
	log "github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	"k8s.io/client-go/kubernetes"
	"oam-manage-backend/utils/logs"
	"path"
	"runtime"
)

const (
	TimeFormat                    string = "2006-01-02 15:04:05.000"
	ClusterConfigSecretLabelKey   string = "oam.com/cluster.metadata"
	ClusterConfigSecretLabelValue string = "true"
)

var (
	Port       string
	JwtSignKey string
	JwtExpTime int64 // jwt token过期时间,单位 分钟
	Username   string
	Password   string
	// inCluster 相关配置
	MetadataNamespace string // 元数据存储的namespace
	// inCluster 客户端
	InClusterClientSet *kubernetes.Clientset
	ClusterKubeconfig  map[string]string
)

type ReturnData struct {
	Status  int                    `json:"status"`
	Message string                 `json:"message"`
	Data    map[string]interface{} `json:"data"`
}

// 构造函数
func NewReturnData() ReturnData {
	returnData := ReturnData{}
	returnData.Status = 200
	data := make(map[string]interface{})
	returnData.Data = data
	return returnData
}

func initLogSetting(logLevel string) {
	// 配置程序的日志输出级别
	if logLevel == "debug" {
		log.SetLevel(log.DebugLevel)
	} else {
		log.SetLevel(log.InfoLevel)
	}
	// 文件名和行号加进去
	log.SetReportCaller(true)
	// 日志格式改成json
	log.SetFormatter(&log.JSONFormatter{
		TimestampFormat: TimeFormat,
		// runtime.Frame: 帧 可用于获取调用者返回的PC值的函数、文件或者是行信息
		CallerPrettyfier: func(f *runtime.Frame) (function string, file string) {
			fileName := path.Base(f.File)
			return f.Function, fileName
		},
	})
}

func init() {
	// 环境变量加载程序配置
	viper.SetDefault("LOG_LEVEL", "debug")
	// 获取程序启动端口号的配置
	viper.SetDefault("PORT", ":8080")
	// 获取jwt加密的secret
	viper.SetDefault("JWT_SIGN_KEY", "admin")
	// 获取jwt过期时间的配置
	viper.SetDefault("JWT_EXPIRE_TIME", 1200)
	// 配置用户名密码的默认值
	// 加密用户名和密码 md5
	// 默认值:admin admin123 注：windwos下USERNAME变量是电脑登录用户名，在这里设置的变量不会覆盖
	viper.SetDefault("USERNAME", "21232F297A57A5A743894A0E4A801FC3")
	viper.SetDefault("PASSWORD", "0192023A7BBD73250516F069DF18B500")
	// inCluster 相关配置
	viper.SetDefault("METADATA_NAMESPACE", "oam")
	// 加载变量
	viper.AutomaticEnv()

	logLevel := viper.GetString("LOG_LEVEL")
	// 加载日志输出格式
	initLogSetting(logLevel)
	logs.Deubg(nil, "开始加载程序配置")
	Port = viper.GetString("PORT")

	// 获取用户名密码
	Username = viper.GetString("USERNAME")
	Password = viper.GetString("PASSWORD")

	// 获取所有配置值
	//allSettings := viper.AllSettings()

	// 打印所有配置值
	//fmt.Println("All Settings:")
	//for key, value := range allSettings {
	//	fmt.Printf("%s: %v\n", key, value)
	//}

	JwtSignKey = viper.GetString("SECRET_KEY")
	JwtExpTime = viper.GetInt64("JWT_EXPIRE_TIME")
	// inCluster相关配置
	MetadataNamespace = viper.GetString("METADATA_NAMESPACE")
	logs.Deubg(map[string]interface{}{"用户名": Username, "密码": Password}, "获取到程序用户名密码配置")

}
